package day8;

import org.hamcrest.Condition.Step;
import org.junit.Test;

public class StringDemo {
	@Test
	public void test1() {
		// "abc"直接括起来的字符串叫做常量字符串
		// 如果常量池中有这个字符串就直接使用这个字符串，如果没有就在常量池中new一个字符串使用
		String str1 = "abc";
		// 自己手动new的字符串和常量字符串是不一样的，是存放在堆里独立的
		String str2 = new String("abc");
		// 发现在常量池中有这个字符串就直接指向常量池中已有的字符串
		String str3 = "abc";
		String str4 = new String("abc");
	
		System.out.println(str1 == str2);
		System.out.println(str2 == str3);
		System.out.println(str1 == str3);
		System.out.println(str4 == str2);
	}
	// 字符串双等号 == 比较的是地址
	// equal比较的是数值
	@Test
	public void test2() {
		String str1 = new String("abc");
		String str2 = new String("AbC");
		System.out.println(str1 == str2);
		System.out.println(str1.equals(str2));// 不忽视大小写
		System.out.println(str1.equalsIgnoreCase(str2));// 忽视大小写

	}

	@Test
	public void test3() {
		//System.out.println(string.length());
		//System.out.println(string.charAt(2));// 第五个指的是下标，即从0 开始第五个即为A

		String string = "javaAnd AndroidA";
		// index索引，找第一个A 出现的位置
		System.out.println(string.indexOf('A'));
		System.out.println(string.indexOf('z'));
		// indexof的返回值都为数字int类型，当找不到指定值时，返回-1
		System.out.println(string.indexOf('A', 6));
		// 从第7个数开始，第一次出现A的位置，显示的数是第一次出现A的下标,这是一个数组，所以第一个数为0
		System.out.println(string.lastIndexOf("And"));// 6
		System.out.println(string.indexOf("And"));// 6
		System.out.println(string.lastIndexOf('A'));// 12
	}

//	System.out.println(str.contains(" zz"));

	@Test
	public void test4() {
		String str = "Java Android";
		System.out.println(str.startsWith("Java"));// 以什么为开头
		// offset:偏移
		System.out.println(str.startsWith("And", 5));// 偏移到5这个位置
		System.out.println(str.endsWith("oidA"));// 以什么为结尾
		System.out.println(str.isEmpty());// 判断是否为空
		System.out.println("".isEmpty());// 常量字符串是一个空字符串但也是对象，能够使用其中的String方法
		//Empty 空的
	}

	@Test // 转换
	public void test5() {
		String string = "java And";
		// 字符串的
		char[] chs = string.toCharArray();// 把字符串变成字符类型的数组
		char[] array = { 'j', 'a', 'v', 'a', ' ', 'A', 'n', 'd' };

		// ArrayList、数组都是可以舒勇foreach遍历的，
		for (char c : chs) {
			System.out.print(c);
		}

		String str2 = new String(array);// 和toCharArray相反的操作，将字符串数组转换为字符串
		System.out.println(str2);
	}

	@Test
	public void test6() {
		// 替换，取代  replace
		String str = "java And";
		String newstr = str.replace('A', 'B');
		System.out.println(str);
		System.out.println(newstr);
	}

	@Test
	public void test7() {
		// 切割,split 
		String str1 = "java Android Python";
		String[] array = str1.split(" ");
		for (String string : array) {
			System.out.println(string);
		}
	}
	
	@Test
	public void test8() {
		//截取子串
		String str1 = "java Android Python";
		System.out.println(str1.substring(5));//从第下标为5的字符开始到结尾切割为一个子串
		System.out.println(str1.substring(5, 9));//从下表为5到下标为9-1 的字符开始到即为切割为一个子串
		
	}
	
	@Test
	public void test9() {
		String str = "   java   Android    ";
		System.out.println(str);
		System.out.println(str.trim());//去除空格
	}
	
	@Test
	public void test10() {
		String str1 = "abc";
		StringBuffer stringBuffer = new StringBuffer("abc");
		StringBuilder stringBuilder = new StringBuilder("abc");
	}
	
	public void test11() {
		String str1 = "java";
		String str2 = "Android";
		String str3 = "Python";
		String str4 = "C";
		//这是一种	不好的方式，因为String类型 的长度是不可改变的，每次（+）做拼接的时候都会new一个新的字符串对象会造成资源浪费
		String str = str1 + str2 + str3;
		//长度可以改变而不是创建新的对象,是不停的追加,所以更多的用在拼接上面
		StringBuilder builder = new StringBuilder(str1);//java
		builder.append(str2);//javaAndroid
		builder.append(str3);//javaAndroidPython
		builder.append(str4);//javaAndroidPythonC
		System.out.println(builder);
		//链式编程
		StringBuilder builder2 = new StringBuilder(str1);//java
		builder2.append(str2).append(str3).append(str4);
	}
}
